Gate balance effects and FIO refresh on engine readiness (wallet cache v2)#6080
Gate balance effects and FIO refresh on engine readiness (wallet cache v2)#6080j0ntz wants to merge 2 commits into
Conversation
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
00faa89 to
7f1149f
Compare
With the core's wallet cache (wallet cache v2 phase 1), wallet objects
exist before their engines load, and waitForAllWallets resolves in that
window. Three login-path surfaces consumed engine state immediately:
- The action queue's address-balance effect read balanceMap right after
awaiting the wallet, which could evaluate a balance effect against
cached, possibly stale balances. It now reports not-yet-effective
until the engine has fully synced, matching the conservatism the loan
flow already applies.
- The FIO address refresh called otherMethods on pre-engine wallets,
which is {} in that window. Services now waits for each FIO wallet's
engine-backed otherMethods (bounded by a generous safety-valve
timeout) before refreshing.
- FioService's periodic expired-domain check called
otherMethods.getFioAddresses the same way (caught live on the sim).
It now skips pre-engine wallets and lets the next 30s cycle retry,
which also avoids wedging its one-shot expiredChecking latch.
7f1149f to
0a089ca
Compare
The core's new post-login queue staggers cached wallets' engine startup. withWallet covers every wallet-scoped scene, so opening one calls waitForCurrencyWallet, which moves that wallet's engine to the front of the queue.
There was a problem hiding this comment.
Claude Code Review
Claude Code Review is paused for this repository. To reconnect it, an admin of this repository's GitHub organization (or the account owner, for personal repositories) who can also manage your Claude organization's Code Review settings needs to re-link GitHub in Code Review settings. This is a one-time step.
Tip: disable this comment in your organization's Code Review settings.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 99b80e3. Configure here.







CHANGELOG
Does this branch warrant an entry to the CHANGELOG?
Dependencies
EdgeApp/edge-core-js#733
Requirements
If you have made any visual changes to the GUI. Make sure you have:
Description
GUI-side patches for wallet cache v2 phase 1 (TDD section 7: immutable snapshot). With EdgeApp/edge-core-js#733, wallet objects exist before their engines load and
waitForAllWalletsresolves in that window, so the login-path surfaces that consumed engine state at resolve-time are gated on engine readiness:checkActionEffect.ts(address-balance): reported the effect againstbalanceMapimmediately after awaiting the wallet, which could now evaluate cached, possibly stale balances. It reports not-yet-effective until the engine has fully synced (same conservatism as the loan flow'swaitForLoanAccountSyncand the existing< 1treatment in spend paths, TDD 7.4), letting the action queue's normal 15s poll re-check.Services.tsx: the post-waitForAllWalletsFIO refreshes (refreshConnectedWallets,refreshAllFioAddresses) callwallet.otherMethods.*, which the core guarantees is{}pre-engine. A newwaitForWalletOtherMethodsutil watchesotherMethodsuntil the engine's methods land (10-minute safety-valve timeout, roughly matching how longwaitForAllWalletscould already take on large accounts before the cache existed).FioService.ts: the periodic expired-domain check callsotherMethods.getFioAddressesthe same way. This one was NOT in the TDD's section-7 audit; it was caught live on the simulator (red dev alertwallet.otherMethods.getFioAddresses is not a functionseconds after a warm cached login). Being a 30s periodic task, it skips pre-engine wallets and lets the next cycle retry, which also avoids wedging its one-shotexpiredCheckinglatch when no wallet is ready yet.Remaining
otherMethodscall sites (FIO scenes, staking, WalletConnect) are user-navigation surfaces audited in the TDD as safe (null-probes, or flows that imply an engine exists) and are unchanged.Tested on the iOS simulator against the linked core build (edge-funds, 194 wallets): cold login wrote all 194
walletCache.jsonfiles; warm relaunch rendered the full wallet list with names and balances from the cache while engines were still loading; no FIO alert through 140s of runtime; drilling into a wallet shows live engine-backed data on the same wallet object. Screenshots attached below.Phase 2: tap-prioritization
The core now staggers cached wallets' engine startup through a limited-concurrency queue (EdgeApp/edge-core-js#733 phase 2).
withWalletwraps every wallet-scoped scene, so opening one callsaccount.waitForCurrencyWallet(walletId), which moves that wallet's engine startup to the front of the queue. The call is a fire-and-forget hint; a deleted or broken wallet is already handled by the existing goBack effect.Post-implementation retrospective (estimate vs. actuals, spec gaps found during implementation): https://gist.github.com/j0ntz/b4476ff5d593b6b206ef17d8c6b260d6#11-post-implementation-retrospective
Asana: https://app.asana.com/1/9976422036640/project/1213843652804305/task/1216673467164267
Note
Medium Risk
Touches post-login FIO refresh, periodic FIO expiry checks, and action-queue balance gating—areas that can mis-fire or stall if readiness checks are wrong, but changes are conservative (defer until sync/engine methods exist).
Overview
Adapts the GUI to wallet cache v2, where wallet objects can appear before their engines load and
waitForAllWalletsmay resolve in that window.Action queue:
address-balanceeffects no longer treat cachedbalanceMapas authoritative; they stay not effective untilsyncStatus.totalRatioreachesDONE_THRESHOLD, then re-check on the existing 15s delay.Login FIO path: After
waitForAllWallets,Serviceswaits per FIO wallet via newwaitForWalletOtherMethods(watchesotherMethods, 10‑minute timeout, per-wallet errors logged) and bails if the account logged out before runningrefreshConnectedWallets/refreshAllFioAddresses.FioService: The periodic expiry check only runs against wallets with
getFioAddresses; pre-engine wallets are skipped for retry on the next cycle, andexpiredCheckingis cleared infinallyso errors or empty runs cannot wedge the latch.Navigation:
withWalletcallsaccount.waitForCurrencyWallet(walletId)when opening wallet-scoped scenes so the core prioritizes that engine in the post-login queue.Reviewed by Cursor Bugbot for commit 99b80e3. Bugbot is set up for automated code reviews on this repo. Configure here.